home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / patches / dungeon.lha / Dungeon / Source.lha / demons.c < prev    next >
C/C++ Source or Header  |  1995-10-14  |  12KB  |  602 lines

  1. /* FIGHTD- INTERMOVE FIGHT DEMON */
  2.  
  3. /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
  4. /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
  5. /* WRITTEN BY R. M. SUPNIK */
  6.  
  7. #include "funcs.h"
  8. #include "vars.h"
  9.  
  10. static logical infest_ P((integer));
  11.  
  12. void fightd_()
  13. {
  14.     /* Initialized data */
  15.  
  16.     const integer rout = 1;
  17.  
  18.     /* System generated locals */
  19.     integer i__1, i__2;
  20.  
  21.     /* Local variables */
  22.     logical f;
  23.     integer i, j, ra;
  24.     integer obj;
  25.     integer res;
  26.     integer out;
  27.  
  28.     i__1 = vill_1.vlnt;
  29.     for (i = 1; i <= i__1; ++i) {
  30. /*                         !LOOP THRU VILLAINS. */
  31.     vill_1.vopps[i - 1] = 0;
  32. /*                         !CLEAR OPPONENT SLOT. */
  33.     obj = vill_1.villns[i - 1];
  34. /*                         !GET OBJECT NO. */
  35.     ra = objcts_1.oactio[obj - 1];
  36. /*                         !GET HIS ACTION. */
  37.     if (play_1.here != objcts_1.oroom[obj - 1]) {
  38.         goto L2200;
  39.     }
  40. /*                         !ADVENTURER STILL HERE? */
  41.     if (obj == oindex_1.thief && findex_1.thfenf) {
  42.         goto L2400;
  43.     }
  44. /*                         !THIEF ENGROSSED? */
  45.     if (objcts_1.ocapac[obj - 1] >= 0) {
  46.         goto L2050;
  47.     }
  48. /*                         !YES, VILL AWAKE? */
  49.     if (vill_1.vprob[i - 1] == 0 || ! prob_(vill_1.vprob[i - 1], 
  50.         vill_1.vprob[i - 1])) {
  51.         goto L2025;
  52.     }
  53.     objcts_1.ocapac[obj - 1] = (i__2 = objcts_1.ocapac[obj - 1], abs(i__2)
  54.         );
  55.     vill_1.vprob[i - 1] = 0;
  56.     if (ra == 0) {
  57.         goto L2400;
  58.     }
  59. /*                         !ANYTHING TO DO? */
  60.     prsvec_1.prsa = vindex_1.inxw;
  61. /*                         !YES, WAKE HIM UP. */
  62.     f = oappli_(ra, 0);
  63.     goto L2400;
  64. /*                         !NOTHING ELSE HAPPENS. */
  65.  
  66. L2025:
  67.     vill_1.vprob[i - 1] += 10;
  68. /*                         !INCREASE WAKEUP PROB. */
  69.     goto L2400;
  70. /*                         !NOTHING ELSE. */
  71.  
  72. L2050:
  73.     if ((objcts_1.oflag2[obj - 1] & FITEBT) == 0) {
  74.         goto L2100;
  75.     }
  76.     vill_1.vopps[i - 1] = obj;
  77. /*                         !FIGHTING, SET UP OPP. */
  78.     goto L2400;
  79.  
  80. L2100:
  81.     if (ra == 0) {
  82.         goto L2400;
  83.     }
  84. /*                         !NOT FIGHTING, */
  85.     prsvec_1.prsa = vindex_1.frstqw;
  86. /*                         !SET UP PROBABILITY */
  87.     if (! oappli_(ra, 0)) {
  88.         goto L2400;
  89.     }
  90. /*                         !OF FIGHTING. */
  91.     objcts_1.oflag2[obj - 1] |= FITEBT;
  92.     vill_1.vopps[i - 1] = obj;
  93. /*                         !SET UP OPP. */
  94.     goto L2400;
  95.  
  96. L2200:
  97.     if ((objcts_1.oflag2[obj - 1] & FITEBT) == 0 || ra == 0) {
  98.         goto L2300;
  99.     }
  100.     prsvec_1.prsa = vindex_1.fightw;
  101. /*                         !HAVE A FIGHT. */
  102.     f = oappli_(ra, 0);
  103. L2300:
  104.     if (obj == oindex_1.thief) {
  105.         findex_1.thfenf = FALSE_;
  106.     }
  107. /*                         !TURN OFF ENGROSSED. */
  108.     advs_1.aflag[aindex_1.player - 1] &= ~ aflags_1.astag;
  109.     objcts_1.oflag2[obj - 1] &= ~ (STAGBT + FITEBT);
  110.     if (objcts_1.ocapac[obj - 1] >= 0 || ra == 0) {
  111.         goto L2400;
  112.     }
  113.     prsvec_1.prsa = vindex_1.inxw;
  114. /*                         !WAKE HIM UP. */
  115.     f = oappli_(ra, 0);
  116.     objcts_1.ocapac[obj - 1] = (i__2 = objcts_1.ocapac[obj - 1], abs(i__2)
  117.         );
  118. L2400:
  119.     ;
  120.     }
  121. /* FIGHTD, PAGE 3 */
  122.  
  123. /* NOW DO ACTUAL COUNTERBLOWS. */
  124.  
  125.     out = 0;
  126. /*                         !ASSUME HERO OK. */
  127. L2600:
  128.     i__1 = vill_1.vlnt;
  129.     for (i = 1; i <= i__1; ++i) {
  130. /*                         !LOOP THRU OPPS. */
  131.     j = vill_1.vopps[i - 1];
  132.     if (j == 0) {
  133.         goto L2700;
  134.     }
  135. /*                         !SLOT EMPTY? */
  136.     prsvec_1.prscon = 1;
  137. /*                         !STOP CMD STREAM. */
  138.     ra = objcts_1.oactio[j - 1];
  139.     if (ra == 0) {
  140.         goto L2650;
  141.     }
  142. /*                         !VILLAIN ACTION? */
  143.     prsvec_1.prsa = vindex_1.fightw;
  144. /*                         !SEE IF */
  145.     if (oappli_(ra, 0)) {
  146.         goto L2700;
  147.     }
  148. /*                         !SPECIAL ACTION. */
  149. L2650:
  150.     res = blow_(aindex_1.player, j, vill_1.vmelee[i - 1], 0, out);
  151.  
  152. /*                         !STRIKE BLOW. */
  153.     if (res < 0) {
  154.         return;
  155.     }
  156. /*                         !IF HERO DEAD, EXIT. */
  157.     if (res == rout) {
  158.         out = rnd_(3) + 2;
  159.     }
  160. /*                         !IF HERO OUT, SET FLG. */
  161. L2700:
  162.     ;
  163.     }
  164.     --out;
  165. /*                         !DECREMENT OUT COUNT. */
  166.     if (out > 0) {
  167.     goto L2600;
  168.     }
  169. /*                         !IF STILL OUT, GO AGAIN. */
  170.     return;
  171.  
  172. } /* fightd_ */
  173.  
  174. /* BLOW- STRIKE BLOW */
  175.  
  176. /* DECLARATIONS */
  177.  
  178. integer blow_(h, v, rmk, hflg, out)
  179. integer h;
  180. integer v;
  181. integer rmk;
  182. logical hflg;
  183. integer out;
  184. {
  185.     /* Initialized data */
  186.  
  187.     const integer rmiss = 0;
  188.     const integer rout = 1;
  189.     const integer rkill = 2;
  190.     const integer rstag = 5;
  191.     const integer rlose = 6;
  192.     const integer rhes = 7;
  193.     const integer rsit = 8;
  194.     static const integer def1r[3] = { 1,2,3 };
  195.     static const integer def2r[4] = { 13,23,24,25 };
  196.     static const integer def3r[5] = { 35,36,46,47,57 };
  197.     static const integer rvectr[66] = { 0,0,0,0,5,5,1,1,2,2,2,2,0,0,0,0,0,5,
  198.         5,3,3,1,0,0,0,5,5,3,3,3,1,2,2,2,0,0,0,0,0,5,5,3,3,4,4,0,0,0,5,5,
  199.         3,3,3,4,4,4,0,5,5,3,3,3,3,4,4,4 };
  200.     static const integer rstate[45] = { 5000,3005,3008,4011,3015,3018,1021,
  201.         0,0,5022,3027,3030,4033,3037,3040,1043,0,0,4044,2048,4050,4054,
  202.         5058,4063,4067,3071,1074,4075,1079,4080,4084,4088,4092,4096,4100,
  203.         1104,4105,2109,4111,4115,4119,4123,4127,3131,3134 };
  204.  
  205.     /* System generated locals */
  206.     integer ret_val, i__1, i__2;
  207.  
  208.     /* Local variables */
  209.     logical f;
  210.     integer i, j, oa, ra, od, mi, dv, def;
  211.     integer tbl;
  212.     integer att, res;
  213.     integer dweap;
  214.     integer pblose;
  215.  
  216.     ra = objcts_1.oactio[v - 1];
  217. /*                         !GET VILLAIN ACTION, */
  218.     dv = objcts_1.odesc2[v - 1];
  219. /*                         !DESCRIPTION. */
  220.     ret_val = rmiss;
  221. /*                         !ASSUME NO RESULT. */
  222.     if (! (hflg)) {
  223.     goto L1000;
  224.     }
  225. /*                         !HERO STRIKING BLOW? */
  226.  
  227. /* HERO IS ATTACKER, VILLAIN IS DEFENDER. */
  228.  
  229.     pblose = 10;
  230. /*                         !BAD LK PROB. */
  231.     objcts_1.oflag2[v - 1] |= FITEBT;
  232.     if ((advs_1.aflag[h - 1] & aflags_1.astag) == 0) {
  233.     goto L100;
  234.     }
  235.     rspeak_(591);
  236. /*                         !YES, CANT FIGHT. */
  237.     advs_1.aflag[h - 1] &= ~ aflags_1.astag;
  238.     return ret_val;
  239.  
  240. L100:
  241.     att = fights_(h, 1);
  242. /*                         !GET HIS STRENGTH. */
  243.     oa = att;
  244.     def = vilstr_(v);
  245. /*                         !GET VILL STRENGTH. */
  246.     od = def;
  247.     dweap = 0;
  248. /*                         !ASSUME NO WEAPON. */
  249.     i__1 = objcts_1.olnt;
  250.     for (i = 1; i <= i__1; ++i) {
  251. /*                         !SEARCH VILLAIN. */
  252.     if (objcts_1.ocan[i - 1] == v && (objcts_1.oflag2[i - 1] & 
  253.         WEAPBT) != 0) {
  254.         dweap = i;
  255.     }
  256. /* L200: */
  257.     }
  258.     if (v == advs_1.aobj[aindex_1.player - 1]) {
  259.     goto L300;
  260.     }
  261. /*                         !KILLING SELF? */
  262.     if (def != 0) {
  263.     goto L2000;
  264.     }
  265. /*                         !DEFENDER ALIVE? */
  266.     rspsub_(592, dv);
  267. /*                         !VILLAIN DEAD. */
  268.     return ret_val;
  269.  
  270. L300:
  271.     jigsup_(593);
  272. /*                         !KILLING SELF. */
  273.     return ret_val;
  274.  
  275. /* VILLAIN IS ATTACKER, HERO IS DEFENDER. */
  276.  
  277. L1000:
  278.     pblose = 50;
  279. /*                         !BAD LK PROB. */
  280.     advs_1.aflag[h - 1] &= ~ aflags_1.astag;
  281.     if ((objcts_1.oflag2[v - 1] & STAGBT) == 0) {
  282.     goto L1200;
  283.     }
  284.     objcts_1.oflag2[v - 1] &= ~ STAGBT;
  285.     rspsub_(594, dv);
  286. /*                         !DESCRIBE. */
  287.     return ret_val;
  288.  
  289. L1200:
  290.     att = vilstr_(v);
  291. /*                         !SET UP ATT, DEF. */
  292.     oa = att;
  293.     def = fights_(h, 1);
  294.     if (def <= 0) {
  295.     return ret_val;
  296.     }
  297. /*                         !DONT ALLOW DEAD DEF. */
  298.     od = fights_(h, 0);
  299.     dweap = (i__1 = fwim_(0, WEAPBT, 0, 0, h, 1), 
  300.         abs(i__1));
  301. /*                         !FIND A WEAPON. */
  302. /* BLOW, PAGE 4 */
  303.  
  304. /* PARTIES ARE NOW EQUIPPED.  DEF CANNOT BE ZERO. */
  305. /* ATT MUST BE > 0. */
  306.  
  307. L2000:
  308.     if (def > 0) {
  309.     goto L2100;
  310.     }
  311. /*                         !DEF ALIVE? */
  312.     res = rkill;
  313.     if (hflg) {
  314.     rspsub_(595, dv);
  315.     }
  316. /*                         !DEADER. */
  317.     goto L3000;
  318.  
  319. L2100:
  320.     if ((i__1 = def - 2) < 0) {
  321.     goto L2200;
  322.     } else if (i__1 == 0) {
  323.     goto L2300;
  324.     } else {
  325.     goto L2400;
  326.     }
  327. /*                         !DEF <2,=2,>2 */
  328. L2200:
  329.     att = min(att,3);
  330. /*                         !SCALE ATT. */
  331.     tbl = def1r[att - 1];
  332. /*                         !CHOOSE TABLE. */
  333.     goto L2500;
  334.  
  335. L2300:
  336.     att = min(att,4);
  337. /*                         !SCALE ATT. */
  338.     tbl = def2r[att - 1];
  339. /*                         !CHOOSE TABLE. */
  340.     goto L2500;
  341.  
  342. L2400:
  343.     att -= def;
  344. /*                         !SCALE ATT. */
  345. /* Computing MIN */
  346.     i__1 = 2, i__2 = max(-2,att);
  347.     att = min(i__1,i__2) + 3;
  348.     tbl = def3r[att - 1];
  349.  
  350. L2500:
  351.     res = rvectr[tbl + rnd_(10) - 1];
  352. /*                         !GET RESULT. */
  353.     if (out == 0) {
  354.     goto L2600;
  355.     }
  356. /*                         !WAS HE OUT? */
  357.     if (res == rstag) {
  358.     goto L2550;
  359.     }
  360. /*                         !YES, STAG--> HES. */
  361.     res = rsit;
  362. /*                         !OTHERWISE, SITTING. */
  363.     goto L2600;
  364. L2550:
  365.     res = rhes;
  366. L2600:
  367.     if (res == rstag && dweap != 0 && prob_(25, pblose)) {
  368.     res = rlose;
  369.     }
  370.  
  371.     mi = rstate[(rmk - 1) * 9 + res];
  372. /*                         !CHOOSE TABLE ENTRY. */
  373.     if (mi == 0) {
  374.     goto L3000;
  375.     }
  376.     i__1 = mi / 1000;
  377.     i = mi % 1000 + rnd_(i__1) + star_1.mbase + 1;
  378.     j = dv;
  379.     if (! (hflg) && dweap != 0) {
  380.     j = objcts_1.odesc2[dweap - 1];
  381.     }
  382.     rspsub_(i, j);
  383. /*                         !PRESENT RESULT. */
  384. /* BLOW, PAGE 5 */
  385.  
  386. /* NOW APPLY RESULT */
  387.  
  388. L3000:
  389.     switch (res + 1) {
  390.     case 1:  goto L4000;
  391.     case 2:  goto L3100;
  392.     case 3:  goto L3200;
  393.     case 4:  goto L3300;
  394.     case 5:  goto L3400;
  395.     case 6:  goto L3500;
  396.     case 7:  goto L3600;
  397.     case 8:  goto L4000;
  398.     case 9:  goto L3200;
  399.     }
  400.  
  401. L3100:
  402.     if (hflg) {
  403.     def = -def;
  404.     }
  405. /*                         !UNCONSCIOUS. */
  406.     goto L4000;
  407.  
  408. L3200:
  409.     def = 0;
  410. /*                         !KILLED OR SITTING DUCK. */
  411.     goto L4000;
  412.  
  413. L3300:
  414. /* Computing MAX */
  415.     i__1 = 0, i__2 = def - 1;
  416.     def = max(i__1,i__2);
  417. /*                         !LIGHT WOUND. */
  418.     goto L4000;
  419.  
  420. L3400:
  421. /* Computing MAX */
  422.     i__1 = 0, i__2 = def - 2;
  423.     def = max(i__1,i__2);
  424. /*                         !SERIOUS WOUND. */
  425.     goto L4000;
  426.  
  427. L3500:
  428.     if (hflg) {
  429.     goto L3550;
  430.     }
  431. /*                         !STAGGERED. */
  432.     advs_1.aflag[h - 1] |= aflags_1.astag;
  433.     goto L4000;
  434.  
  435. L3550:
  436.     objcts_1.oflag2[v - 1] |= STAGBT;
  437.     goto L4000;
  438.  
  439. L3600:
  440.     newsta_(dweap, 0, play_1.here, 0, 0);
  441. /*                         !LOSE WEAPON. */
  442.     dweap = 0;
  443.     if (hflg) {
  444.     goto L4000;
  445.     }
  446. /*                         !IF HERO, DONE. */
  447.     dweap = (i__1 = fwim_(0, WEAPBT, 0, 0, h, 1), 
  448.         abs(i__1));
  449. /*                         !GET NEW. */
  450.     if (dweap != 0) {
  451.     rspsub_(605, objcts_1.odesc2[dweap - 1]);
  452.     }
  453. /* BLOW, PAGE 6 */
  454.  
  455. L4000:
  456.     ret_val = res;
  457. /*                         !RETURN RESULT. */
  458.     if (! (hflg)) {
  459.     goto L4500;
  460.     }
  461. /*                         !HERO? */
  462.     objcts_1.ocapac[v - 1] = def;
  463. /*                         !STORE NEW CAPACITY. */
  464.     if (def != 0) {
  465.     goto L4100;
  466.     }
  467. /*                         !DEAD? */
  468.     objcts_1.oflag2[v - 1] &= ~ FITEBT;
  469.     rspsub_(572, dv);
  470. /*                         !HE DIES. */
  471.     newsta_(v, 0, 0, 0, 0);
  472. /*                         !MAKE HIM DISAPPEAR. */
  473.     if (ra == 0) {
  474.     return ret_val;
  475.     }
  476. /*                         !IF NX TO DO, EXIT. */
  477.     prsvec_1.prsa = vindex_1.deadxw;
  478. /*                         !LET HIM KNOW. */
  479.     f = oappli_(ra, 0);
  480.     return ret_val;
  481.  
  482. L4100:
  483.     if (res != rout || ra == 0) {
  484.     return ret_val;
  485.     }
  486.     prsvec_1.prsa = vindex_1.outxw;
  487. /*                         !LET HIM BE OUT. */
  488.     f = oappli_(ra, 0);
  489.     return ret_val;
  490.  
  491. L4500:
  492.     advs_1.astren[h - 1] = -10000;
  493. /*                         !ASSUME DEAD. */
  494.     if (def != 0) {
  495.     advs_1.astren[h - 1] = def - od;
  496.     }
  497.     if (def >= od) {
  498.     goto L4600;
  499.     }
  500.     cevent_1.ctick[cindex_1.cevcur - 1] = 30;
  501.     cevent_1.cflag[cindex_1.cevcur - 1] = TRUE_;
  502. L4600:
  503.     if (fights_(h, 1) > 0) {
  504.     return ret_val;
  505.     }
  506.     advs_1.astren[h - 1] = 1 - fights_(h, 0);
  507. /*                         !HE'S DEAD. */
  508.     jigsup_(596);
  509.     ret_val = -1;
  510.     return ret_val;
  511.  
  512. } /* blow_ */
  513.  
  514. /* SWORDD- SWORD INTERMOVE DEMON */
  515.  
  516. /* DECLARATIONS */
  517.  
  518. void swordd_()
  519. {
  520.     /* System generated locals */
  521.     integer i__1, i__2;
  522.  
  523.     /* Local variables */
  524.     integer i, ng;
  525.  
  526.     if (objcts_1.oadv[oindex_1.sword - 1] != aindex_1.player) {
  527.     goto L500;
  528.     }
  529. /*                         !HOLDING SWORD? */
  530.     ng = 2;
  531. /*                         !ASSUME VILL CLOSE. */
  532.     if (infest_(play_1.here)) {
  533.     goto L300;
  534.     }
  535. /*                         !VILL HERE? */
  536.     ng = 1;
  537.     i__1 = xsrch_1.xmax;
  538.     i__2 = xsrch_1.xmin;
  539.     for (i = xsrch_1.xmin; i__2 < 0 ? i >= i__1 : i <= i__1; i += i__2) {
  540. /*                         !NO, SEARCH ROOMS. */
  541.     if (! findxt_(i, play_1.here)) {
  542.         goto L200;
  543.     }
  544. /*                         !ROOM THAT WAY? */
  545.     switch (curxt_1.xtype) {
  546.         case 1:  goto L50;
  547.         case 2:  goto L200;
  548.         case 3:  goto L50;
  549.         case 4:  goto L50;
  550.     }
  551. /*                         !SEE IF ROOM AT ALL. */
  552. L50:
  553.     if (infest_(curxt_1.xroom1)) {
  554.         goto L300;
  555.     }
  556. /*                         !CHECK ROOM. */
  557. L200:
  558.     ;
  559.     }
  560.     ng = 0;
  561. /*                         !NO GLOW. */
  562.  
  563. L300:
  564.     if (ng == hack_1.swdsta) {
  565.     return;
  566.     }
  567. /*                         !ANY STATE CHANGE? */
  568.     i__2 = ng + 495;
  569.     rspeak_(i__2);
  570. /*                         !YES, TELL NEW STATE. */
  571.     hack_1.swdsta = ng;
  572.     return;
  573.  
  574. L500:
  575.     hack_1.swdact = FALSE_;
  576. /*                         !DROPPED SWORD, */
  577.     return;
  578. /*                         !DISABLE DEMON. */
  579. } /* swordd_ */
  580.  
  581. /* INFEST-    SUBROUTINE TO TEST FOR INFESTED ROOM */
  582.  
  583. /* DECLARATIONS */
  584. static logical infest_(r)
  585. integer r;
  586. {
  587.     /* System generated locals */
  588.     logical ret_val;
  589.  
  590.     if (! findex_1.endgmf) {
  591.     ret_val = objcts_1.oroom[oindex_1.cyclo - 1] == r || objcts_1.oroom[
  592.         oindex_1.troll - 1] == r || objcts_1.oroom[oindex_1.thief - 
  593.         1] == r && hack_1.thfact;
  594.     }
  595.     else {
  596.     ret_val = r == rindex_1.mrg || r == rindex_1.mrge || r == 
  597.         rindex_1.mrgw || r == rindex_1.inmir && findex_1.mloc == 
  598.         rindex_1.mrg;
  599.     }
  600.     return ret_val;
  601. } /* infest_ */
  602.